//////////////////////////////////////////////////////////////////////////
#include "Application.h"
#include "../Scene/Scene.h"
#include <cassert>
#include "hge.h"
#include "HotSpot/HotSpot.h"
//////////////////////////////////////////////////////////////////////////
Application* Application::m_instance = NULL;
int Application::m_mouseButtons[] = {HGEK_LBUTTON, HGEK_RBUTTON, HGEK_MBUTTON};
//////////////////////////////////////////////////////////////////////////
extern HGE* hge;
//////////////////////////////////////////////////////////////////////////
Application::Application()
: m_currentScene(NULL)
, m_updateHSListNeeded(false)
, m_mousePos(0.0f, 0.0f)
, m_lastScene(NULL)
, m_exitReady(false)
{

}
//////////////////////////////////////////////////////////////////////////
Application::~Application()
{
	assert(m_currentScene);
	if(m_currentScene)
	{
		deleteCurrentScene();
		delete m_currentScene;
		m_currentScene = NULL;
	}
}
//////////////////////////////////////////////////////////////////////////
void Application::loadScene( Scene* scene )
{
	if(m_currentScene)
	{
		deleteCurrentScene();
		m_lastScene = m_currentScene;
	}

	m_currentScene = scene;
}
//////////////////////////////////////////////////////////////////////////
void Application::render()
{
	if(m_currentScene)
	{
		m_currentScene->render();
	}
}
//////////////////////////////////////////////////////////////////////////
void Application::update( float dt )
{
	hge->Input_GetMousePos(&m_mousePos.x, &m_mousePos.y);

	if(m_currentScene)
	{
		m_currentScene->update(dt);
	}

	if(m_updateHSListNeeded)
		m_updateHSListNeeded = false;
	
	for(int i = 0; i < 3; ++i)
	{
		bool mouseDown = hge->Input_KeyDown(m_mouseButtons[i]);
		bool mouseUp = hge->Input_KeyUp(m_mouseButtons[i]);
		
		if(mouseDown || mouseUp)
		{
			for(std::list<HotSpot*>::reverse_iterator it = m_hotSpotesList.rbegin(); it != m_hotSpotesList.rend(); ++it)
			{
				if(mouseDown)
					if((*it)->checkMouseEvent(i, true))
						break;
				if(mouseUp)
					if((*it)->checkMouseEvent(i, false))
						break;
			}
		}
	}
	
	if(m_lastScene)
	{
		delete m_lastScene;
		m_lastScene = NULL;
	}
}

//////////////////////////////////////////////////////////////////////////
Application* Application::instance()
{
	assert(m_instance);
	if(m_instance)
	{
		return m_instance;
	}
	return NULL;
}
//////////////////////////////////////////////////////////////////////////
void Application::createApplication()
{
	assert(!m_instance);
	if(!m_instance)
		m_instance = new Application();
}
//////////////////////////////////////////////////////////////////////////
void Application::deleteApplication()
{
	assert(m_instance);
	if(m_instance)
	{
		delete m_instance;
		m_instance = NULL;
	}
}
//////////////////////////////////////////////////////////////////////////
void Application::addHotSpot( HotSpot* hotSpot )
{
	m_hotSpotesList.push_back(hotSpot);
}
//////////////////////////////////////////////////////////////////////////
void Application::setUpdateHSListNeeded()
{
	m_updateHSListNeeded = true;
}
//////////////////////////////////////////////////////////////////////////
void Application::deleteCurrentScene()
{
	m_hotSpotesList.clear();
}
//////////////////////////////////////////////////////////////////////////
void Application::exit()
{
	m_exitReady = true;
}
